{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## reduce(func)\n",
    "\n",
    "Agrega os elementos do RDD usando uma função `func` (que leva dois argumentos e retorna um). A função deve ser [comutativa](https://pt.wikipedia.org/wiki/Comutatividade) e [associativa](https://pt.wikipedia.org/wiki/Associatividade) para que possa ser computada corretamente em paralelo.\n",
    "\n",
    "Exemplo:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "data = sc.parallelize(range(1, 11))\n",
    "\n",
    "def summation(a, b): return a + b\n",
    "def max(a, b): return a if a > b else b\n",
    "\n",
    "print 'data', data.collect()\n",
    "print 'sum: ', data.reduce(summation)\n",
    "print 'max: ', data.reduce(max)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## collect()\n",
    "\n",
    "Retornar todos os elementos do RDD como uma lista (do python, no caso). Isso geralmente é útil após um filtro ou outra operação que retorna um subconjunto suficientemente pequeno dos dados.\n",
    "\n",
    "Exemplo:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "data = sc.parallelize(range(1, 1001))\n",
    "print 'data: ', data.filter(lambda i: i % 10 == 0).collect()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## count()\n",
    "\n",
    "Retorna o número de elementos no RDD.\n",
    "\n",
    "Exemplo:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false,
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "data = sc.parallelize(range(1, 1001))\n",
    "print 'data: ', data.count()\n",
    "print 'data filtered: ', data.filter(lambda i: i % 10 == 0).count()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## take(n)\n",
    "\n",
    "Retorna uma lista com os primeiros n elementos do RDD.\n",
    "\n",
    "Exemplo:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "data = sc.parallelize(range(1, 1001))\n",
    "print 'data first 10: ', data.take(10)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## takeSample(withReplacement, num, [seed])\n",
    "\n",
    "Retorna uma lista com uma amostra aleatória de `num` elementos do RDD, com ou sem substituição (`withReplacement`), opcionalmente pré-especificando uma semente (`seed`) de gerador de números aleatórios.\n",
    "\n",
    "Exemplo:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "data = sc.parallelize(range(1, 11))\n",
    "print data.takeSample(True, 4)\n",
    "print data.takeSample(False, 4)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## saveAsTextFile(path)\t\n",
    "\n",
    "Escreve os elementos do RDD como um arquivo de texto (ou conjunto de arquivos de texto) em um determinado diretório no sistema de arquivos local, no HDFS ou qualquer outro sistema de arquivos suportado pelo Hadoop. O Spark chamará `toString` em cada elemento para convertê-lo em uma linha de texto no arquivo.\n",
    "\n",
    "Exemplo:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "data = sc.parallelize(range(1, 1001))\n",
    "data.saveAsTextFile(\"range_1_to_100\")\n",
    "\n",
    "# Visualize o diretório deste notebook. Existirá um pasta com o nome range_1_to_100. \n",
    "# Nela haverá arquivos que do RDD. Cada partição do processamento tem um arquivo correspondente."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## foreach(func)\n",
    "\n",
    "Executa uma função `func` para cada elemento do RDD. Isso geralmente é feito para operações sem tanto efeito, como atualizar um acumulador ou interagir com sistemas de armazenamento externo.\n",
    "\n",
    "Exemplo:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "data = sc.parallelize(range(1, 1001))\n",
    "\n",
    "\n",
    "summation_20_mult = sc.accumulator(0)\n",
    "\n",
    "def conditional_print(i):\n",
    "    if i % 20 == 0: \n",
    "        summation_20_mult.add(i)\n",
    "     \n",
    "\n",
    "data.foreach(conditional_print)\n",
    "\n",
    "print 'Summation of multiple of 20 from 1 to 1000: ', summation_20_mult.value"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "Links:\n",
    "* Lista mais completa com mais funções comuns: http://spark.apache.org/docs/1.6.3/programming-guide.html#actions\n",
    "* Documentação da API RDD do Spark: http://spark.apache.org/docs/1.6.3/api/python/pyspark.html#pyspark.RDD"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Pyspark (Py 2)",
   "language": "",
   "name": "pyspark"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.8"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
